/**
 * Copyright (c) 2017-2024 Nop Platform. All rights reserved.
 * Author: canonical_entropy@163.com
 * Blog:   https://www.zhihu.com/people/canonical-entropy
 * Gitee:  https://gitee.com/canonical-entropy/nop-entropy
 * Github: https://github.com/entropy-cloud/nop-entropy
 */
package com.gitee.wsl.struct.table

import com.gitee.wsl.api.IFreezable


/**
 * 单元格的只读视图。
 *
 *
 * 对于单元格合并的情况，rowSpan或者colSpan大于1，最左上角的单元格为realCell。同时会产生一系列占位用的Proxy单元格。
 */
interface ICellView : IFreezable {

    val isProxyCell: Boolean
        /**
         * 单元格合并时，合并后被屏蔽的单元格位置用代理单元格来占位
         */
        get() = false

    /**
     * 每个单元格都具有唯一id。 ProxyCell返回的是realCell.getId()
     */
    val id: String?

    val styleId: String?

    val comment: String?

    fun cloneInstance(): ICellView

    var row: IRowView?

    val realCell: ICellView?

    val rowOffset: Int
        /**
         * 如果单元格发生合并，则被合并的单元格会用代理单元格来占位。rowOffset指定了代理单元格相对于左上角的偏移量。 例如 B2和B3单元格合并，则B2对应realCell，rowOffset=0,colOffset=0,
         * 同时在B3位置会用代理单元格占位， 它的realCell对应B2，而rowOffset=1,colOffset=0
         */
        get() = 0

    val colOffset: Int
        get() = 0

    
    val colSpan: Int
        get() = mergeAcross + 1

    
    val rowSpan: Int
        get() = mergeDown + 1

    /**
     * 向下合并的行数，缺省为0。 对于ProxyCell, 这里总返回0
     */
    val mergeDown: Int

    /**
     * 向右合并的列数，缺省为0 对于ProxyCell， 这里总返回0
     */
    val mergeAcross: Int

    /**
     * 单元格的值。对于Proxy单元格，这里总返回null
     */
    val value: Any?

    val isExportFormattedValue: Boolean
        get() = false

    val formattedValue: Any?
        get() = value

    val formula: String?

    val exportValue: Any?
        get() = value

    
    val text: String
        get() {
            val value = formattedValue
            if (value is Iterable<*>) return value.joinToString()
            return value.toString()
        }

    val linkUrl: String?
        get() = null

    
    val isBlankCell: Boolean
        get() = text.isBlank()
}